//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "PV3D.h"
//---------------------------------------------------------------------------

PV3D::PV3D(double x, double y, double z, int vector){
        _x=x;
        _y=y;
        _z=z;

        _v=vector;
}

PV3D::~PV3D(){
}

double PV3D::productoEscalar(PV3D* vector){
        double x,y,z,resultado;
        x=vector->getX();
        y=vector->getY();
        z=vector->getZ();

        resultado=(x*_x)+(y*_y)+(z*_z);

        return resultado;
}

double PV3D::productoEscalar(double x, double y, double z){

        PV3D* punto=new PV3D(x,y,z,0);

        double resultado=productoEscalar(punto);
        delete punto;
        
        return resultado;
}

PV3D* PV3D::productoVectorial(PV3D* v){
        PV3D* i= new PV3D(1,0,0,0);
        PV3D* j= new PV3D(0,1,0,0);
        PV3D* k= new PV3D(0,0,1,0);
        PV3D* resultado=productoVectorial(v,i,j,k);
        delete i;
        delete j;
        delete k;
        return resultado;
}

PV3D* PV3D::productoVectorial(PV3D* v, PV3D* i, PV3D* j, PV3D* k){

        double x,y,z,determinante1,determinante2,determinante3;
        PV3D* resultado;
        x=y=z=0;
        determinante1=(_y*v->getZ())-(_z*v->getY());
        determinante2=(_x*v->getZ())-(_z*v->getX());
        determinante3=(_x*v->getY())-(_y*v->getX());
        x=(i->getX()*determinante1)+(j->getX()*determinante2)+(k->getX()*determinante3);
        y=(i->getY()*determinante1)+(j->getY()*determinante2)+(k->getY()*determinante3);
        z=(i->getZ()*determinante1)+(j->getZ()*determinante2)+(k->getZ()*determinante3);
        resultado= new PV3D(x,y,z,0);
        return resultado;
}

double PV3D::modulo(){
        double resultado=sqrt((_x*_x)+(_y*_y)+(_z*_z));
        return resultado;
}

void PV3D::normaliza(){
      double m=modulo();
      _x/=m;
      _y/=m;
      _z/=m;  
}

void PV3D::mueve(double x, double y, double z){
        _x=x;
        _y=y;
        _z=z;
}

void PV3D::mueve(PV3D* lePoisicion){
        _x=lePoisicion->getX();
        _y=lePoisicion->getY();
        _z=lePoisicion->getZ();
}

void PV3D::opuesto(){
        _x*=-1.0;
        _y*=-1.0;
        _z*=-1.0;
}

//---------------------------------------------------------------------------

#pragma package(smart_init)
